//唐崇展
#ifndef SCHEDULER_H
#define SCHEDULER_H

#include <QObject>
#include <QList>
#include <string>

// 前向声明Simulator类
class Simulator;

class Scheduler : public QObject
{
    Q_OBJECT

private:

    Simulator* sim;                  // 指向Simulator的指针：用于直接访问映射表和硬编码参数
    const int MAX_TIME_STEP = 23;    // 固定时间步上限（0-23）
    const int MIN_TIME_STEP = 0;     // 固定时间步下限

    // 辅助函数：计算储能当前SOC（基于Simulator的储能功率映射表和硬编码容量）
    float calculateEssSoc(int currentTime);


public:
    std::string algorithmType;       // 调度算法类型（经济调度/规则调度）
    // 构造函数：需传入关联的Simulator实例，默认算法为“经济调度”
    explicit Scheduler(QObject* parent = nullptr,
                       std::string algoType = "经济调度",
                       Simulator* simulator = nullptr);
    void setAlgorithmType(const std::string& type); // 新增：设置算法类型

public slots:
    // 核心槽函数：接收当前仿真时间，触发调度（直接访问Simulator数据并修改映射表）
    void onSimulationTime(int currentTime);


signals:
    // 调度完成信号：输出按“光伏、储能、柴油、电网”顺序的功率数据
    void scheduleCompleted(const QList<double>& powerData);


private:
    // 执行调度逻辑（直接修改映射表）
    void executeScheduling(int currentTime);

    // 经济调度算法（成本最小化）
    void economicDispatch(int currentTime);

    // 规则调度算法（优先级调度）
    void ruleBasedDispatch(int currentTime);
};

#endif // SCHEDULER_H
